/**
 * 如何建立 react ssr 的同构, 服务器端使用 react 的 renderToString 将 jsx 变为 string html, 那么也就是说 server 端只是将 jsx 转换为 string html 放回给前端, 浏览器会将渲染 string html;
 * 但是前端会执行对应的 js 从而将 react 的代码重新执行一遍, 就是所谓的同构, 因为 server 端渲染的 html 字符串会过滤点 jsx 中的 js 逻辑, 前端重新执行对应的 js 文件, 是为了接管页面的逻辑,
 * 但是前端通过 ajax 获取到的数据, server 无法获取到, 如果前端在 react 生命周期 componentDidMount 这个生命周期中发起 ajax 请求获取数据进行 render data,
 * 那么这样将 server 端渲染的 html string 中将不会包含该数据, 因为server 端只会将 render中的 jsx 变为 html String, 不会执行对应的生命周期函数, 那么将不会获取对应的数据, 生命周期函数只会在前端会执行,
 * 这样是不利于 seo 的, 那么我们需要处理这样的 case; 处理这样的问题, 需要使用 node 做为中间件来获取数据进行填充数据,
 * react ssr 可以结合 redux redux-thunk(做异步处理的一个库)
 * ssr 的路由处理问题: react-route-config
 * beyond compare: 比对两个文件的差异的工具,
 * 解决同构 css 样式的问题, server端使用 isomorphic-style-loader 这个打包工具, 普通的服务器的 css 样式的渲染, 可能会造成页面的抖动, ,  client 端就使用普通的 css 打包的工具,
 * seo 的问题: title 和 description 这两个描述的对 seo 没有太大的优化,主要是提升了网站的转化率; 关键字搜索是网站的文本的全文匹配搜索的关键字,(就是全文检索的搜索引擎);
 * 如何做好 seo 呢 ??? => 网站由: 文字(原创), 文件, 链接, react-helmet 可以定制页面的 title 和 description; 用于同构,
 * 由于 ssr 的架构会使项目变的非常的复杂, 需要考虑具体的业务: 比如: 高 seo 和 首屏渲染速度
 * 预渲染来解决 seo 的问题: 如果是爬虫的访问我们的网站, 那么我们可以作为一个预渲染(prerender 工具构建 prerender server), 那么 爬虫得到的就是一个完整的, 具有数据的页面, 如果是人访问我们的网站, 那么我们就正常的使用 js 渲染页面,
 * 使用 nginx 作为中间代理, 判断是否是用户, 或者是搜索引擎,
 * 工具构建 prerender(prerender.io) 原理: 会生成一个小的浏览器, 通过浏览器来加载这个网站, 获取这个网站的完整内容, 再放回网站给爬虫
  */
